package com.qingzhuge.sms;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.qingzhuge.sms.vo.SmsRequest;
import com.qingzhuge.sms.vo.SmsSendDetails;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author : zero.xiao
 * @description :
 * @date : 2018/9/21 0021 上午 11:02
 * @modified :
 * @since :
 */
public class SmsUtil {
    /**
     * 产品名称:云通信短信API产品,开发者无需替换
     */
    private static final String ALI_PRODUCT = "Dysmsapi";
    /**
     * 产品域名,开发者无需替换
     */
    private static final String ALI_DOMAIN = "dysmsapi.aliyuncs.com";

    public static SmsSendDetails sendSms(SmsRequest vo) throws ClientException {

        //可自助调整超时时间
        System.setProperty("sun.net.client.defaultConnectTimeout", vo.getDefaultConnectTimeout().toString());
        System.setProperty("sun.net.client.defaultReadTimeout", vo.getDefaultReadTimeout().toString());

        //初始化acsClient,暂不支持region化
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", vo.getAccessKeyId(), vo.getAccessKeySecret());
        DefaultProfile.addEndpoint("cn-hangzhou", ALI_PRODUCT, ALI_DOMAIN);
        IAcsClient acsClient = new DefaultAcsClient(profile);
        //组装请求对象-具体描述见控制台-文档部分内容
        SendSmsRequest request = new SendSmsRequest();
        //必填:待发送手机号
        request.setPhoneNumbers(vo.getPhone());
        //必填:短信签名-可在短信控制台中找到
        request.setSignName(vo.getSign());
        //必填:短信模板-可在短信控制台中找到
        request.setTemplateCode(vo.getTemplateCode());
        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
        request.setTemplateParam(vo.getValue());
        //选填-上行短信扩展码(无特殊需求用户请忽略此字段)如果需要查看短信回复。这个得填上
        request.setSmsUpExtendCode(vo.getSmsUpExtendCode());
        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
        request.setOutId(vo.getOutId());
        //hint 此处可能会抛出异常，注意catch
        SendSmsResponse response = acsClient.getAcsResponse(request);
        SmsSendDetails details = new SmsSendDetails();
        details.setBizId(response.getBizId());
        details.setCode(response.getCode());
        details.setMessage(response.getMessage());
        details.setRequestId(response.getRequestId());
        return details;
    }

    public static SmsSendDetails querySendDetails(SmsRequest sms) throws ClientException {
        //可自助调整超时时间
        System.setProperty("sun.net.client.defaultConnectTimeout", sms.getDefaultConnectTimeout().toString());
        System.setProperty("sun.net.client.defaultReadTimeout", sms.getDefaultReadTimeout().toString());
        //初始化acsClient,暂不支持region化
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", sms.getAccessKeyId(), sms.getAccessKeySecret());
        DefaultProfile.addEndpoint( "cn-hangzhou", ALI_PRODUCT, ALI_DOMAIN);
        IAcsClient acsClient = new DefaultAcsClient(profile);
        //组装请求对象
        QuerySendDetailsRequest request = new QuerySendDetailsRequest();
        //必填-号码
        request.setPhoneNumber(sms.getPhone());
        //可选-流水号
        request.setBizId(sms.getBizId());
        //必填-发送日期 支持30天内记录查询，格式yyyyMMdd
        SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
        request.setSendDate(ft.format(new Date()));
        //必填-页大小
        request.setPageSize(sms.getPageSize());
        //必填-当前页码从1开始计数
        request.setCurrentPage(sms.getCurrentPage());
        //hint 此处可能会抛出异常，注意catch
        QuerySendDetailsResponse response = acsClient.getAcsResponse(request);
        SmsSendDetails details = new SmsSendDetails();
        details.setCode(response.getCode());
        details.setMessage(response.getMessage());
        details.setRequestId(response.getRequestId());
        details.setTotalCount(response.getTotalCount());
        details.setBizId(sms.getBizId());
        details.setPhone(sms.getPhone());
        List<SmsSendDetails.SmsSendDetailDTO> detailDTOs = new ArrayList<>();
        for (QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : response.getSmsSendDetailDTOs()) {
            SmsSendDetails.SmsSendDetailDTO dto = new SmsSendDetails.SmsSendDetailDTO();
            dto.setContent(smsSendDetailDTO.getContent());
            dto.setErrCode(smsSendDetailDTO.getErrCode());
            dto.setOutId(smsSendDetailDTO.getOutId());
            dto.setPhoneNum(smsSendDetailDTO.getPhoneNum());
            dto.setReceiveDate(smsSendDetailDTO.getReceiveDate());
            dto.setSendDate(smsSendDetailDTO.getSendDate());
            dto.setSendStatus(smsSendDetailDTO.getSendStatus());
            dto.setTemplateCode(smsSendDetailDTO.getTemplateCode());
            detailDTOs.add(dto);
        }
        details.setSmsSendDetailDTOs(detailDTOs);
        return details;
    }
}
